# 1、导入模块 sqlite3
import sqlite3,json,ast

# 2、数据库文件
db_file='/Users/zhangdingqu/Documents/CSV/shopeemy.sqlite'

#3、获取与数据库的连接
conn=sqlite3.connect(db_file)
cur=conn.cursor()
#列出所有表名
tab_name_list=cur.execute("select name from sqlite_master where type='table' order by name")
print('所有的表名：',tab_name_list.fetchall())

#查询 itemview 表的数据
ALL_data=cur.execute("select * from itemview").fetchall()

#查询所有字段
tabs=cur.execute(" PRAGMA table_info([itemview])").fetchall()

_input=input('请选择是提取数据还是更新数据？1 提取 2 处理')
if _input=="1":
    # 查询分组名称
    Grouping_list = cur.execute("select 分組 from itemview").fetchall()
    # 得到查询结果后去重结果
    Grouping = list(set(Grouping_list))
    print('分组名称有:%s' % Grouping)
    input_text = input('请输入要处理的分组名称')
    # 查询所有字段为input_text的数据
    selest_data = cur.execute("select * from itemview where 分組='%s'" % input_text).fetchall()

    # 取出查询出的数据的 商品選項 数据列表
    Class_ttribute = cur.execute("select 商品編號,商品選項 from itemview where 分組='%s'"%input_text).fetchall()
    true = 1

    try:
        #创建表
        try:
            cur.execute('DROP TABLE 选择修改数据表')
        except:
            pass
        cur.execute(
            'CREATE TABLE 选择修改数据表(ID INTEGER PRIMARY KEY AUTOINCREMENT,sku TEXT,Myoption_ INTEGER ,规格总数 INTEGER ,规格名称1 TEXT,选项名称1 TEXT,规格名称2 TEXT,选项名称2 TEXT,规格名称3 TEXT,选项名称3 TEXT,规格名称4 TEXT,选项名称4 TEXT)')
    except:
        print('创建数据表出错')

    def analysis(data):
        '''
        :param data: 列表源数据
        :return: 返货整理好的 列表 和 规格数，不带ID
        '''
        # print(data)
        key=list(data[0].keys())[0]
        tmap_A_list=data[0][key]
        Specification_number=tmap_A_list.__len__()
        tmap_B_list=data[1]
        print(tmap_B_list)
        data_dict={}
        data_dict.update({'Specification_number':Specification_number})
        for i in tmap_A_list:
            tmap_list = []
            for ii in i[list(i.keys())[1]]:
                key=list(ii.keys())[0]
                tmap_list.append(ii[key])
            data_dict.update({i[list(i.keys())[0]]:tmap_list})
        return data_dict



    for i in Class_ttribute:
        if i[1]!='':
            print(i)
            #获取列表的商品选项列表
            data=eval(i[1])
            data_dict=analysis(data)
            print(data_dict)
            keys_list=list(data_dict.keys())
            # print()
            # sql = "insert into 选择修改数据表 (sku,规格名称1,选项名称1,规格名称2,选项名称2,规格名称3,选项名称3) values ('张三',50,'男',80)"
            if data_dict['Specification_number']==1:
                #这里不需要更改，2项规格可以用
                continue
                # sql = "insert into 选择修改数据表 (sku,Myoption_,规格总数,规格名称1,选项名称1,规格名称2,选项名称2,规格名称3,选项名称3,规格名称4,选项名称4) values (?,?,?,?,?,?,?,?,?,?,?)"
                # valu = (
                # i[0], '', data_dict['Specification_number'], keys_list[1], str(data_dict[keys_list[1]]), '',
                # '', '', '', '', '',)
            elif data_dict['Specification_number'] == 2:
                # 这里不需要更改，2项规格可以用
                continue
                # sql = "insert into 选择修改数据表 (sku,Myoption_,规格总数,规格名称1,选项名称1,规格名称2,选项名称2,规格名称3,选项名称3,规格名称4,选项名称4) values (?,?,?,?,?,?,?,?,?,?,?)"
                # valu = (
                # i[0], '', data_dict['Specification_number'], keys_list[1], str(data_dict[keys_list[1]]), keys_list[2],
                # str(data_dict[keys_list[2]]), '', '', '', '',)
            elif data_dict['Specification_number'] == 3:
                sql = "insert into 选择修改数据表 (sku,Myoption_,规格总数,规格名称1,选项名称1,规格名称2,选项名称2,规格名称3,选项名称3,规格名称4,选项名称4) values (?,?,?,?,?,?,?,?,?,?,?)"
                valu = (
                i[0], '', data_dict['Specification_number'], keys_list[1], str(data_dict[keys_list[1]]), keys_list[2],
                str(data_dict[keys_list[2]]), keys_list[3], str(data_dict[keys_list[3]]), '', '',)
            elif data_dict['Specification_number'] == 4:
                sql = "insert into 选择修改数据表 (sku,Myoption,规格总数,规格名称1,选项名称1,规格名称2,选项名称2,规格名称3,选项名称3,规格名称4,选项名称4) values (?,?,?,?,?,?,?,?,?,?,?)"
                valu=(i[0],'',data_dict['Specification_number'],keys_list[1],str(data_dict[keys_list[1]]),keys_list[2],str(data_dict[keys_list[2]]),keys_list[3],str(data_dict[keys_list[3]]),keys_list[4],str(data_dict[keys_list[4]]),)
            else:
                print('===规格超出了4个了！或者规格数为0 请注意==='*5)

            try:
                cur.execute(sql,valu)
            except sqlite3.ProgrammingError as e:
                print('数据库写入出错',e)
            except sqlite3.InterfaceError:
                print('数据类型不匹配')
    conn.commit()
    print('请用sqlite数据库可视化工具进行修改第二列的待删除编号 填写1～3 数字')

#常用SQL语句   UPDATE "选择修改数据表" SET Myoption_ = 1
else:
    def upda():
        # 查询 itemview 表的数据
        try:
            ALL_data = cur.execute("select * from 选择修改数据表").fetchall()
            #print(ALL_data)
        except sqlite3.OperationalError:
            print('你还没有完成第一步的操作，请先完成第一步，提取出商品规格进行删除选择')
            return 0
        true="true"
        prohibit = input('请输入要剔除的违禁词选项，即将过滤 颜色分类 和 尺寸 等全部的选项名，做删除操作，请谨慎填入关键词格式是个列表 "关键词1","关键词2" :').split(',')
        for i in ALL_data:
            # 等待更新数据 查询到数据的语句 select 商品選項 from itemview WHERE "商品編號"=571544269043 OR "商品主貨號"=571544269043
            #print(i)
            #获取客户选择的待删除的选项名列表
            # #规格名
            try:
                dele_name=[i[5-1], i[7-1], i[9-1]]
            except:
                print()
            #选项名s
            dete_item = [i[5], i[7], i[9]]
            #Source_data 源数据
            Source_data=cur.execute('select 商品選項 from itemview WHERE "商品編號"=%s OR "商品主貨號"=%s'%(i[1],i[1])).fetchall()

            #新数据，一会进行组合
            #找出客户选择1、2、3那部分的数据，一会进行替换
            dataRows=list(eval(Source_data[0][0])[0].keys())[0]
            #DimensionDescription=eval(Source_data[0][0])[1]
            source_list=eval(Source_data[0][0])[0][dataRows]


            #如果=<2项规格名就不要再删除了
            if source_list.__len__()<=2:
                print('这个商品只有两项规格，不需要删除 %s'%source_list[i[2] - 1])
                continue
            # 删除选项包含违禁词的选项
            for keyi in range(prohibit.__len__()):
                for item,numbe in zip(source_list,range(source_list.__len__())):
                    specValue=list(item.keys())[1]
                    for item2,num in zip(item[list(item.keys())[1]],range(len(item[list(item.keys())[1]]))):
                        #如果这个选项名包含违禁词，就将其剔除
                        if prohibit[keyi] in item2['name']:
                            mes=source_list[numbe][specValue].pop(num)
                            print('删除了ID为 %s 的选项%s'%(i[2],mes))

            #删除客户所选的选项组，获取第一部分
            try:
                print('正在删除商品编号为%s的%s数据' % (i[1], source_list[i[2] - 1]))
                source_list.remove(source_list[i[2] - 1])

            except:
                print(i[1],'没有选择要删除的规格')
                continue
            The_first_part={dataRows:source_list}


            #获取第二部分使用的代码
            str_dic = eval(Source_data[0][0])[1]
            Key_word=eval(dete_item[0])
            DimensionDescription=str(str_dic)
            for ii in Key_word:
                DimensionDescription=DimensionDescription.replace(ii+'/','')

            DimensionDescription=eval(DimensionDescription)


            # ================第一部分=================
            #print(The_first_part)
            #================第二部分=================
            #print(DimensionDescription)
            #===============合并=============
            new=[The_first_part,DimensionDescription]


            print()
            try:
                #UPDATE "itemview" SET "商品主貨號"=123456 WHERE "商品編號"==571544269043 OR "商品主貨號"==571544269043
                sql='UPDATE "itemview" SET "商品選項"="%s" where "商品編號"=%s OR "商品主貨號"=%s'%(new,i[1],i[1])
                cur.execute(sql)
            except:
                print()
    upda()
    print('修改了%d行数据' % cur.rowcount)
    conn.commit()
print('修改的数据库位置在：%s'%db_file)


